
//
//  SZBarrageDataPacket.m
//  Pods
//
//  Created by Zahi on 2017/9/7.
//
//

#import "SZBarrageDataPacket.h"

@implementation SZBarrageDataPacket


- (instancetype)init
{
    self = [super init];
    if (self) {
        _secureField = 0;
        _reservedField = 0;
    }
    return self;
}


/// 通过二进制构建数据包对象 解码
- (instancetype)initWithRawData:(NSData *)rawData
{
    self = [super init];
    
    if (self) {
        
        // 获取类型的二进制数据-->对类型进行赋值
        [[rawData subdataWithRange:NSMakeRange(4, 2)] getBytes:&_type length:2];
        
        // 加密字段解析
        [[rawData subdataWithRange:NSMakeRange(6, 1)] getBytes:&_secureField length:1];
        
        // 保留字段解析
        [[rawData subdataWithRange:NSMakeRange(7, 1)] getBytes:&_reservedField length:1];
        
        // 解析内容 -1 去掉'\0'
        _content = [[NSString alloc] initWithData:[rawData subdataWithRange:NSMakeRange( 8, rawData.length - 8- 1)] encoding:NSUTF8StringEncoding];
    }
    
    return self;
}


/// 返回数据包的长度
- (unsigned int)length
{
    // 数据包长度大小 + 消息类型大小 + 加密字段大小  + 保留字段大小 + 数据部分大小 + '\0'大小
    return 4 + 2 + 1 + 1 + (unsigned int)([self.content dataUsingEncoding:NSUTF8StringEncoding].length) + 1;
}

/// 返回的二进制数据包 编码
- (NSData *)rawData
{
    // 二进制容器：存放所有的数据包内容
    NSMutableData *data = [NSMutableData data];
    
    // 获取数据的大小
    unsigned int dataLen = self.length;
    
    // 存放数据长度的二进制
    [data appendBytes:&dataLen length:4];
    
    // 存放消息内型的二进制
    [data appendBytes:&_type length:2];
    
    // 存放加密字段的二进制
    [data appendBytes:&_secureField length:1];
    
    // 存放保留字典的二进制
    [data appendBytes:&_reservedField length:1];
    
    // 存放内容数据的二进制
    [data appendData:[self.content dataUsingEncoding:NSUTF8StringEncoding]];
    
    // 存放'\0'的二进制
    
    unsigned char endFlog = '\0';
    [data appendBytes:&endFlog length:1];
    
    return data;
}


- (NSString *)description
{
    return [NSString stringWithFormat:@"BarrageDataPacket\nlenth:%d\ntype:%lu\nsecureFlag:%d\nreservedFlag:%d\ncontent:%@\n",self.length, (unsigned long)self.type,self.secureField,self.reservedField,self.content];
}

@end
